#include <REGX52.H>
#include "Timer.h"

#define uchar unsigned char
#define uint  unsigned int

// 用来记录定时溢出的次数,
// 每50毫秒溢出一次，20次就是1秒。
uchar timer0_num = 0;

// 每次溢出，就会触发这个定时中断，
// 当20次的时候，计数器清零，小灯切换，
// 这里发生中断之后，TF0被自动的置0了。
// 中断函数中的操作应该尽可能的少，
// 如果太多，下一次中断到来之前还没有执行完，程序就会有不确定性。
void t0_time() interrupt 1
{
    // 计算出定时器的初始值，这里定时50ms(50毫秒)
    TH0 = (65536 - 50000) / 256;
    TL0 = (65536 - 50000) % 256;
    timer0_num++; // 这里只做计数的累加
}

// 初始化工作
void Timer0Init(void)
{

    // 设置定时器的工作模式，这里用低4位设置了T0定时器的工作模式
    TMOD = 0x01;

    // 设置初始值，TL0低8位，TH0高8位
    TH0 = (65536 - 50000) / 256;
    TL0 = (65536 - 50000) % 256;

    // TCON配置
    TF0 = 0; // 清除TF0标志，溢出置1，没有溢出置0，默认先初始化成0。
    TR0 = 1; // 定时器0开始计时

    // 中断配置
    ET0 = 1; // 打开T0中断
    EA  = 1; // 打开全局中断控制
    PT0 = 0; // 低优先级
}

void liuShuiDeng()
{
    unsigned char i = 0; // 控制是哪个小灯
    unsigned char j = 0; // 控制方向：0：从左到右；1：从右到左。

    Timer0Init();

    while (1) {
        if (timer0_num == 20) // 循环了20次，刚好是1秒
        {
            timer0_num = 0;

            // 从左往右
            if (j == 0) {
                if (i < 8) {
                    P2 = ~(0X80 >> i);
                    i++;
                    if (i == 8) {
                        j = 1;
                    }
                }
            }

            // 从右往左
            if (j == 1) {
                P2 = ~(0X01 << (8 - i));
                i--;
                if (i == 0) {
                    j = 0;
                }
            }
        }
    }
}
